package com.buyu.mvvm.mvvm.viewmodel;

import android.app.Application;
import android.arch.lifecycle.MutableLiveData;

import com.buyu.mvvm.mvvm.api.ApiRepository;
import com.buyu.mvvm.mvvm.api.ResponseObserver;
import com.buyu.mvvm.mvvm.db.SubjectResponse;
import com.buyu.mvvm.mvvm.db.bean.Subject;
import com.buyu.mvvm.mvvm.db.repository.DBRepository;
import com.buyu.mvvm.mvvm.di.DataException;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import rx.functions.Action1;


/**
 * @author cui-hl
 * @version 1.0 2018/11/12
 */
public class HomeListViewModel extends BaseViewModel {

    @Inject
    ApiRepository apiRepository;

    @Inject
    DBRepository dbRepository;

    private APIResponseObserver apiResponseObserver;

    private DBAction dbAction;

    private MutableLiveData<List<Subject>> dataLiveData = new MutableLiveData<>();


    @Inject
    public HomeListViewModel(Application application) {
        super(application);
        apiResponseObserver=new APIResponseObserver();
        dbAction=new DBAction();
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        apiResponseObserver=null;
        dbAction=null;
    }

    public MutableLiveData<List<Subject>> getDataLiveData() {
        return dataLiveData;
    }

    /**
     * 加载数据
     */
    public void initData(){
        //如果画面数据使用缓存，API请求回来的数据不直接响应在画面中。
        //API请求回来的数据先保存到数据库中，然后画面得到API请求成功的回调后，查询数据库做画面内容展示。
//        getList();
        requestData();
    }

    /**
     * 画面数据加载。
     */
    private void getList(){
        dbRepository.getSubjectList(dbAction);
    }

    /**
     * API请求
     */
    private void requestData(){
        apiRepository.login(apiResponseObserver, "");
    }

    /**
     * 定义数据库查询Action。
     * 使用内部类的原因：实例化对象在activity销毁时清除内存引用，避免内存泄漏。
     */
    class DBAction implements Action1<List<Subject>> {
        @Override
        public void call(List<Subject> list) {
            dataLiveData.setValue(list);
        }
    }

    /**
     * 定义API请求Observer。
     * 使用内部类的原因：实例化对象在activity销毁时清除内存引用，避免内存泄漏。
     */
    class APIResponseObserver extends ResponseObserver<SubjectResponse> {
        @Override
        public void onSuccess(SubjectResponse data) {
            //API请求成功回调，访问数据库展示画面内容。
//            getList();
            List<Subject> list=new ArrayList<>();

            dataLiveData.setValue(list);
        }

        @Override
        public void onFail(DataException e) {
            //API请求异常
            errorLiveData.setValue(e);
        }
    }


}
